"""
测试Log_Utils在多实例程序运行时的日志文件锁定处理功能
"""

import os
import tempfile
import shutil
import time
import threading
from com.tools.Log_Utils import LogUtils


def test_multi_instance_file_logging():
    """
    测试多实例程序运行时的日志文件锁定处理功能
    """
    # 创建临时目录用于测试
    temp_dir = tempfile.mkdtemp()
    print(f"使用临时目录进行测试: {temp_dir}")
    
    try:
        log_file = os.path.join(temp_dir, "multi_instance.log")
        
        # 创建第一个日志记录器
        logger1 = LogUtils.create_unique_file_logger("logger1", log_file)
        logger1.info("第一个实例的日志消息")
        
        # 获取实际创建的日志文件路径
        handlers1 = logger1.logger.handlers
        file_handler1 = None
        for handler in handlers1:
            if hasattr(handler, 'baseFilename'):
                file_handler1 = handler
                break
        
        if file_handler1:
            actual_log_file1 = file_handler1.baseFilename
            print(f"第一个实例实际使用的日志文件: {actual_log_file1}")
        
        # 稍微等待一下，确保时间戳不同
        time.sleep(1)
        
        # 创建第二个日志记录器（模拟另一个程序实例）
        logger2 = LogUtils.create_unique_file_logger("logger2", log_file)
        logger2.info("第二个实例的日志消息")
        
        # 获取实际创建的日志文件路径
        handlers2 = logger2.logger.handlers
        file_handler2 = None
        for handler in handlers2:
            if hasattr(handler, 'baseFilename'):
                file_handler2 = handler
                break
        
        if file_handler2:
            actual_log_file2 = file_handler2.baseFilename
            print(f"第二个实例实际使用的日志文件: {actual_log_file2}")
        
        # 验证两个实例使用了不同的日志文件
        if file_handler1 and file_handler2:
            assert actual_log_file1 != actual_log_file2, "两个实例应该使用不同的日志文件"
            print("✓ 两个实例成功使用了不同的日志文件，避免了文件锁定冲突")
        
        # 验证日志内容
        if file_handler1 and os.path.exists(actual_log_file1):
            with open(actual_log_file1, 'r', encoding='utf-8') as f:
                content1 = f.read()
                assert "第一个实例的日志消息" in content1
                print("✓ 第一个实例的日志内容正确")
        
        if file_handler2 and os.path.exists(actual_log_file2):
            with open(actual_log_file2, 'r', encoding='utf-8') as f:
                content2 = f.read()
                assert "第二个实例的日志消息" in content2
                print("✓ 第二个实例的日志内容正确")
        
        print("\n所有多实例日志测试通过!")
        
    finally:
        # 清理临时目录
        shutil.rmtree(temp_dir)
        print(f"\n已清理临时目录: {temp_dir}")


def test_concurrent_logging():
    """
    测试并发写入日志的情况
    """
    temp_dir = tempfile.mkdtemp()
    print(f"\n使用临时目录进行并发测试: {temp_dir}")
    
    try:
        log_file = os.path.join(temp_dir, "concurrent.log")
        
        # 创建共享的日志记录器
        logger = LogUtils("concurrent_logger").add_file_handler(log_file).add_console_handler()
        
        def log_messages(thread_id):
            """在不同线程中记录日志"""
            for i in range(10):
                logger.info(f"线程 {thread_id} 的第 {i+1} 条消息")
                time.sleep(0.01)  # 模拟一些处理时间
        
        # 创建并启动多个线程
        threads = []
        for i in range(5):
            thread = threading.Thread(target=log_messages, args=(i+1,))
            threads.append(thread)
            thread.start()
        
        # 等待所有线程完成
        for thread in threads:
            thread.join()
        
        print("✓ 并发日志记录测试完成")
        
        # 检查日志文件是否存在
        if os.path.exists(log_file):
            with open(log_file, 'r', encoding='utf-8') as f:
                content = f.read()
                # 检查是否包含所有线程的消息
                for i in range(5):
                    assert f"线程 {i+1}" in content
                print("✓ 所有线程的日志消息都已正确记录")
        
    finally:
        # 清理临时目录
        shutil.rmtree(temp_dir)
        print(f"\n已清理临时目录: {temp_dir}")


if __name__ == "__main__":
    test_multi_instance_file_logging()
    test_concurrent_logging()
    print("\n所有测试完成!")